#include "XmlMessage.hh"
#include "Done.hh"
#include "InitMessage.hh"
#include "GameMessage.hh"
#include "ChatBroadcast.hh"
#include "ChatFromClient.hh"
#include "XmlSocket.hh"
#include "../Exception.hh"

using namespace Network;

/**
 * \brief A megfelelő XmlMessage alosztály példányának létrehozása.
 * \param message Az XML üzenet. Az új objektum típusát a root tag neve
 *                határozza meg. A "done","init" és "game" értékek
 *                értelmezettek.
 * \return Megosztott pointer az új üzenet objektumra.
 */
spXmlMessage XmlMessage::construct(QDomDocument const& message) {
    QDomElement root = message.documentElement();
    QString tagName = root.tagName();

    if (tagName == "done")
        return Done::construct(root);

    if (tagName == "init")
        return InitMessage::construct(root);

    if (tagName == "game")
        return GameMessage::construct(root);

    if (tagName == "chat_client")
    	return ChatFromClient::construct(root);

    if (tagName == "chat_broadcast")
        	return ChatBroadcast::construct(root);

    throw NonFatalProtocolError("root invalid");
}

/**
 * \brief Üzenet elküldése.
 * \param socket A socket, amire ki kell küldeni.
 */
void XmlMessage::send_to(XmlSocket& socket) const {
    QDomDocument doc = to_xml();
    socket.write(doc);
}

/**
 * \brief Kliensoldali feldolgozás.
 *
 * Az egyes leszármazottak átdefiniálhatják, alapértelmezés szerint kivételt
 * dob.
 */
void XmlMessage::process_on_client(XmlClient& client) {
    DONTCARE(client);
    throw ProtocolError("unexpected");
}

/**
 * \brief Szerveroldali feldolgozás.
 *
 * Az egyes leszármazottak átdefiniálhatják, alapértelmezés szerint kivételt
 * dob.
 */
void XmlMessage::process_on_server(XmlServerThread& thread) {
    DONTCARE(thread);
    throw NonFatalProtocolError("unexpected");
}
